package com.zwh.rocketmq.demo.normal;


import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;


@Slf4j
@Service
public class NormalMessageConsumer {
    /*
    @RocketMQMessageListener消费者参数细节
     1、consumerGroup:消费者组
     2、topic:消费的主题，和生产者的topic保持一致
     3、consumMode:ComsumeMode.CONCURRENTLY消费者模式 有序和无序，默认无序
     4、messageModel:MessageModel.CLUSTERING 消息模式：广播和集群，默认集群
     5、selectorExpression的意思指的就是tag，默认为“*”，不设置的话会监听所有消息
    集群：一条消息只能被一个消费者实例消费（相当于点对点）
    广播：每个消费者都会收到消息，每条消息可以被多个消费者实例处理（相当于发布订阅）

    note:如果一个consumerGroup下有多个消费者，那这个topic也要有对应数量的broker队列节点，否则超过订阅队列数的消费者实例无效。
    */
    @Service
    @RocketMQMessageListener(topic = "TEST_TOPIC", selectorExpression = "tag1", consumerGroup = "Con_Group_One")
    public class ConsumerSend implements RocketMQListener<String> {
        // 监听到消息就会执行此方法
        @Override
        public void onMessage(String message) {
            log.info("监听到消息：msg={}", message);
        }
    }

    // 注意：这个ConsumerSend2和上面ConsumerSend在没有添加tag做区分时，不能共存，
    // 不然生产者发送一条消息，这两个都会去消费，会造成消息重复消费了问题
    // 如果类型不同会有一个报错，所以实际运用中最好加上tag，写这只是让你看知道就行
    @Service
    @RocketMQMessageListener(topic = "TEST_TOPIC", consumerGroup = "Con_Group_Two")
    public class ConsumerSend2 implements RocketMQListener<String> {
        @Override
        public void onMessage(String str) {
            log.info("监听到消息：str={}", str);
        }
    }
}
